昨天我們介紹了圖形元件「文字框 QLineEdit」。今天我們來介紹「下拉選單 QComboBox」
下拉選單也是非常常見的圖形元件。最常見的就是地址選單,選縣市,選鄉鎮。直接從內定的選單去選,可以避免使用者打字手誤。
下面是一個很簡單的使用範例,用 new 創建一個 QComboBox 下拉選單物件之後,可以用 addItem()
添加選單選項,removeItem(int)
可以動態移除選項,count()
可以獲取 QComboBox 中的選項數量。clear()
則是清除所有選項。
值得注意的是,addItem(text, data)
可以帶二個參數,第一個參數是選項文字,第二個參數則是附帶的資料,我們下面的範例會解釋這個很有用的特性。
QComboBox* comboBox = new QComboBox;
comboBox->addItem("Item 1"); // 添加選項
comboBox->addItem("Item 2");
comboBox->addItem("Item 3", "Data3"); // 選項可以帶上第二個資料參數
int count = comboBox->count(); // 選項的總數
int index = comboBox->currentIndex(); // 目前選定的選項編號
comboBox->setCurrentIndex(0); // 選定0號選項
下拉選單最常用的信號是 QComboBox::activated(int index)
,使用者從下拉選單選了一個選項,就會發出這個信號。
下面我們示範用 QComboBox 寫一個銀行代號查詢程式。
下拉選單中會有五家銀行的名字,選擇了銀行後會顯示三碼轉帳代號。
首先我們用 addItem()
添加選項,第一個參數是顯示的文字:也就是銀行名,第二個參數帶入三碼的銀行代號。
//創建下拉選單,添加選項
QComboBox* comboBox = new QComboBox;
comboBox->addItem("台灣銀行", "004");
comboBox->addItem("土地銀行", "005");
comboBox->addItem("第一銀行", "007");
comboBox->addItem("華南銀行", "008");
comboBox->addItem("中華郵政", "700");
//接著創建一個標籤來顯示郵遞區號查詢結果
QLabel* label = new QLabel;
當使用者操作下拉選單時,我們要連接「選項更動」的信號 QComboBox::activated
。
跟 comboBox 物件索取當前的選項文字(銀行名稱),可以用 currentText()
方法。索取選項附帶的資料(addItem傳入的第二個參數)用 currentData()
。
需注意,第二個參數的型態是 QVariant
,這是一個可以裝入各種不同型態變數的萬用容器。我們知道銀行代碼是字串型態,所以用 toString()
來轉型。
QObject::connect(comboBox, &QComboBox::activated, [=]
{
QString bankName = comboBox->currentText();
QString bankCode = comboBox->currentData().toString();
label->setText(bankName + "的轉帳代號是" + bankCode);
});
這樣就可以在切換下拉選項時,看到顯示的銀行代號囉!
以下是完整的範例程式
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QComboBox>
#include <QVBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QVBoxLayout* layout = new QVBoxLayout;
w.setLayout(layout);
//創建下拉選單,添加選項
QComboBox* comboBox = new QComboBox;
comboBox->addItem("台灣銀行", "004");
comboBox->addItem("土地銀行", "005");
comboBox->addItem("第一銀行", "007");
comboBox->addItem("華南銀行", "008");
comboBox->addItem("中華郵政", "700");
//接著創建一個標籤來顯示郵遞區號查詢結果
QLabel* label = new QLabel;
layout->addWidget(label);
layout->addWidget(comboBox);
QObject::connect(comboBox, &QComboBox::activated, [=]
{
QString bankName = comboBox->currentText();
QString bankCode = comboBox->currentData().toString();
label->setText(bankName + "的轉帳代號是" + bankCode);
});
w.show();
return a.exec();
}